{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 416,
   "id": "83865623",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import collections\n",
    "import random"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f152642",
   "metadata": {},
   "source": [
    "## 0、数据处理成csv形式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 417,
   "id": "8eb38d83",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   age          workclass  fnlwgt   education  educationNum  \\\n",
      "0   39          State-gov   77516   Bachelors            13   \n",
      "1   50   Self-emp-not-inc   83311   Bachelors            13   \n",
      "2   38            Private  215646     HS-grad             9   \n",
      "3   53            Private  234721        11th             7   \n",
      "4   28            Private  338409   Bachelors            13   \n",
      "\n",
      "         maritalStatus          occupation    relationship    race      sex  \\\n",
      "0        Never-married        Adm-clerical   Not-in-family   White     Male   \n",
      "1   Married-civ-spouse     Exec-managerial         Husband   White     Male   \n",
      "2             Divorced   Handlers-cleaners   Not-in-family   White     Male   \n",
      "3   Married-civ-spouse   Handlers-cleaners         Husband   Black     Male   \n",
      "4   Married-civ-spouse      Prof-specialty            Wife   Black   Female   \n",
      "\n",
      "   capitalGain  capitalLoss  hoursPerWeek   nativeCountry  income  \n",
      "0         2174            0            40   United-States   <=50K  \n",
      "1            0            0            13   United-States   <=50K  \n",
      "2            0            0            40   United-States   <=50K  \n",
      "3            0            0            40   United-States   <=50K  \n",
      "4            0            0            40            Cuba   <=50K  \n",
      "   age   workclass  fnlwgt      education  educationNum        maritalStatus  \\\n",
      "0   25     Private  226802           11th             7        Never-married   \n",
      "1   38     Private   89814        HS-grad             9   Married-civ-spouse   \n",
      "2   28   Local-gov  336951     Assoc-acdm            12   Married-civ-spouse   \n",
      "3   44     Private  160323   Some-college            10   Married-civ-spouse   \n",
      "4   18           ?  103497   Some-college            10        Never-married   \n",
      "\n",
      "           occupation relationship    race      sex  capitalGain  capitalLoss  \\\n",
      "0   Machine-op-inspct    Own-child   Black     Male            0            0   \n",
      "1     Farming-fishing      Husband   White     Male            0            0   \n",
      "2     Protective-serv      Husband   White     Male            0            0   \n",
      "3   Machine-op-inspct      Husband   Black     Male         7688            0   \n",
      "4                   ?    Own-child   White   Female            0            0   \n",
      "\n",
      "   hoursPerWeek   nativeCountry   income  \n",
      "0            40   United-States   <=50K.  \n",
      "1            50   United-States   <=50K.  \n",
      "2            40   United-States    >50K.  \n",
      "3            40   United-States    >50K.  \n",
      "4            30   United-States   <=50K.  \n"
     ]
    }
   ],
   "source": [
    "columns = ['age', 'workclass', 'fnlwgt', 'education', 'educationNum', 'maritalStatus', 'occupation', 'relationship', 'race', 'sex',\n",
    "          'capitalGain', 'capitalLoss', 'hoursPerWeek', 'nativeCountry', 'income']\n",
    "df_train_set = pd.read_csv('./adult.data', names=columns)\n",
    "df_test_set = pd.read_csv('./adult.test', names=columns, skiprows=1) #第一行是非法数据\n",
    "\n",
    "print(df_train_set.head())\n",
    "print(df_test_set.head())\n",
    "df_train_set.to_csv('./train_adult.csv', index=False)\n",
    "df_test_set.to_csv('./test_adult.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 418,
   "id": "1ff96a48",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>educationNum</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>25</td>\n",
       "      <td>Private</td>\n",
       "      <td>226802</td>\n",
       "      <td>11th</td>\n",
       "      <td>7</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Machine-op-inspct</td>\n",
       "      <td>Own-child</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>89814</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Farming-fishing</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>50</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>28</td>\n",
       "      <td>Local-gov</td>\n",
       "      <td>336951</td>\n",
       "      <td>Assoc-acdm</td>\n",
       "      <td>12</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Protective-serv</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>44</td>\n",
       "      <td>Private</td>\n",
       "      <td>160323</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>10</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Machine-op-inspct</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>7688</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>18</td>\n",
       "      <td>?</td>\n",
       "      <td>103497</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>10</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>?</td>\n",
       "      <td>Own-child</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>30</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age   workclass  fnlwgt      education  educationNum        maritalStatus  \\\n",
       "0   25     Private  226802           11th             7        Never-married   \n",
       "1   38     Private   89814        HS-grad             9   Married-civ-spouse   \n",
       "2   28   Local-gov  336951     Assoc-acdm            12   Married-civ-spouse   \n",
       "3   44     Private  160323   Some-college            10   Married-civ-spouse   \n",
       "4   18           ?  103497   Some-college            10        Never-married   \n",
       "\n",
       "           occupation relationship    race      sex  capitalGain  capitalLoss  \\\n",
       "0   Machine-op-inspct    Own-child   Black     Male            0            0   \n",
       "1     Farming-fishing      Husband   White     Male            0            0   \n",
       "2     Protective-serv      Husband   White     Male            0            0   \n",
       "3   Machine-op-inspct      Husband   Black     Male         7688            0   \n",
       "4                   ?    Own-child   White   Female            0            0   \n",
       "\n",
       "   hoursPerWeek   nativeCountry   income  \n",
       "0            40   United-States   <=50K.  \n",
       "1            50   United-States   <=50K.  \n",
       "2            40   United-States    >50K.  \n",
       "3            40   United-States    >50K.  \n",
       "4            30   United-States   <=50K.  "
      ]
     },
     "execution_count": 418,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test_set.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 419,
   "id": "bccd1129",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(32561, 16281, 15)"
      ]
     },
     "execution_count": 419,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_train_set), len(df_test_set), len(df_test_set.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58d8c776",
   "metadata": {},
   "source": [
    "## 1、数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 420,
   "id": "f840bf38",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>fnlwgt</th>\n",
       "      <th>education</th>\n",
       "      <th>educationNum</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>77516</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>Self-emp-not-inc</td>\n",
       "      <td>83311</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>215646</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Divorced</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>234721</td>\n",
       "      <td>11th</td>\n",
       "      <td>7</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>Private</td>\n",
       "      <td>338409</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>13</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Prof-specialty</td>\n",
       "      <td>Wife</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>Cuba</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32556</th>\n",
       "      <td>27</td>\n",
       "      <td>Private</td>\n",
       "      <td>257302</td>\n",
       "      <td>Assoc-acdm</td>\n",
       "      <td>12</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Tech-support</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>38</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32557</th>\n",
       "      <td>40</td>\n",
       "      <td>Private</td>\n",
       "      <td>154374</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Machine-op-inspct</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32558</th>\n",
       "      <td>58</td>\n",
       "      <td>Private</td>\n",
       "      <td>151910</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Widowed</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Unmarried</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32559</th>\n",
       "      <td>22</td>\n",
       "      <td>Private</td>\n",
       "      <td>201490</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Own-child</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>20</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32560</th>\n",
       "      <td>52</td>\n",
       "      <td>Self-emp-inc</td>\n",
       "      <td>287927</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>9</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>15024</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>32561 rows × 15 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       age          workclass  fnlwgt    education  educationNum  \\\n",
       "0       39          State-gov   77516    Bachelors            13   \n",
       "1       50   Self-emp-not-inc   83311    Bachelors            13   \n",
       "2       38            Private  215646      HS-grad             9   \n",
       "3       53            Private  234721         11th             7   \n",
       "4       28            Private  338409    Bachelors            13   \n",
       "...    ...                ...     ...          ...           ...   \n",
       "32556   27            Private  257302   Assoc-acdm            12   \n",
       "32557   40            Private  154374      HS-grad             9   \n",
       "32558   58            Private  151910      HS-grad             9   \n",
       "32559   22            Private  201490      HS-grad             9   \n",
       "32560   52       Self-emp-inc  287927      HS-grad             9   \n",
       "\n",
       "             maritalStatus          occupation    relationship    race  \\\n",
       "0            Never-married        Adm-clerical   Not-in-family   White   \n",
       "1       Married-civ-spouse     Exec-managerial         Husband   White   \n",
       "2                 Divorced   Handlers-cleaners   Not-in-family   White   \n",
       "3       Married-civ-spouse   Handlers-cleaners         Husband   Black   \n",
       "4       Married-civ-spouse      Prof-specialty            Wife   Black   \n",
       "...                    ...                 ...             ...     ...   \n",
       "32556   Married-civ-spouse        Tech-support            Wife   White   \n",
       "32557   Married-civ-spouse   Machine-op-inspct         Husband   White   \n",
       "32558              Widowed        Adm-clerical       Unmarried   White   \n",
       "32559        Never-married        Adm-clerical       Own-child   White   \n",
       "32560   Married-civ-spouse     Exec-managerial            Wife   White   \n",
       "\n",
       "           sex  capitalGain  capitalLoss  hoursPerWeek   nativeCountry  income  \n",
       "0         Male         2174            0            40   United-States   <=50K  \n",
       "1         Male            0            0            13   United-States   <=50K  \n",
       "2         Male            0            0            40   United-States   <=50K  \n",
       "3         Male            0            0            40   United-States   <=50K  \n",
       "4       Female            0            0            40            Cuba   <=50K  \n",
       "...        ...          ...          ...           ...             ...     ...  \n",
       "32556   Female            0            0            38   United-States   <=50K  \n",
       "32557     Male            0            0            40   United-States    >50K  \n",
       "32558   Female            0            0            40   United-States   <=50K  \n",
       "32559     Male            0            0            20   United-States   <=50K  \n",
       "32560   Female        15024            0            40   United-States    >50K  \n",
       "\n",
       "[32561 rows x 15 columns]"
      ]
     },
     "execution_count": 420,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set = pd.read_csv('./train_adult.csv')\n",
    "df_train_set"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b499c4f-bd4f-415d-9311-211091a18f39",
   "metadata": {},
   "source": [
    "## 2、数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a751e794",
   "metadata": {},
   "source": [
    "### 2.1 删除对应属性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 421,
   "id": "ac775bfc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['age', 'workclass', 'education', 'maritalStatus', 'occupation',\n",
      "       'relationship', 'race', 'sex', 'capitalGain', 'capitalLoss',\n",
      "       'hoursPerWeek', 'nativeCountry', 'income'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "df_train_set.drop(['fnlwgt', 'educationNum'], axis=1, inplace=True) # fnlwgt列用处不大，educationNum与education类似\n",
    "print(df_train_set.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f8752b9",
   "metadata": {},
   "source": [
    "### 2.2 重复行记录处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 475,
   "id": "eac9368e",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train_set.drop_duplicates(inplace=True) # 去除重复行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 423,
   "id": "2b4a6e46",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>Self-emp-not-inc</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Divorced</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>11th</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>Private</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Prof-specialty</td>\n",
       "      <td>Wife</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>Cuba</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32554</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>Masters</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32555</th>\n",
       "      <td>22</td>\n",
       "      <td>Private</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Protective-serv</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32556</th>\n",
       "      <td>27</td>\n",
       "      <td>Private</td>\n",
       "      <td>Assoc-acdm</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Tech-support</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>38</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32558</th>\n",
       "      <td>58</td>\n",
       "      <td>Private</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Widowed</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Unmarried</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32560</th>\n",
       "      <td>52</td>\n",
       "      <td>Self-emp-inc</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>15024</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>29096 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       age          workclass      education        maritalStatus  \\\n",
       "0       39          State-gov      Bachelors        Never-married   \n",
       "1       50   Self-emp-not-inc      Bachelors   Married-civ-spouse   \n",
       "2       38            Private        HS-grad             Divorced   \n",
       "3       53            Private           11th   Married-civ-spouse   \n",
       "4       28            Private      Bachelors   Married-civ-spouse   \n",
       "...    ...                ...            ...                  ...   \n",
       "32554   53            Private        Masters   Married-civ-spouse   \n",
       "32555   22            Private   Some-college        Never-married   \n",
       "32556   27            Private     Assoc-acdm   Married-civ-spouse   \n",
       "32558   58            Private        HS-grad              Widowed   \n",
       "32560   52       Self-emp-inc        HS-grad   Married-civ-spouse   \n",
       "\n",
       "               occupation    relationship    race      sex  capitalGain  \\\n",
       "0            Adm-clerical   Not-in-family   White     Male         2174   \n",
       "1         Exec-managerial         Husband   White     Male            0   \n",
       "2       Handlers-cleaners   Not-in-family   White     Male            0   \n",
       "3       Handlers-cleaners         Husband   Black     Male            0   \n",
       "4          Prof-specialty            Wife   Black   Female            0   \n",
       "...                   ...             ...     ...      ...          ...   \n",
       "32554     Exec-managerial         Husband   White     Male            0   \n",
       "32555     Protective-serv   Not-in-family   White     Male            0   \n",
       "32556        Tech-support            Wife   White   Female            0   \n",
       "32558        Adm-clerical       Unmarried   White   Female            0   \n",
       "32560     Exec-managerial            Wife   White   Female        15024   \n",
       "\n",
       "       capitalLoss  hoursPerWeek   nativeCountry  income  \n",
       "0                0            40   United-States   <=50K  \n",
       "1                0            13   United-States   <=50K  \n",
       "2                0            40   United-States   <=50K  \n",
       "3                0            40   United-States   <=50K  \n",
       "4                0            40            Cuba   <=50K  \n",
       "...            ...           ...             ...     ...  \n",
       "32554            0            40   United-States    >50K  \n",
       "32555            0            40   United-States   <=50K  \n",
       "32556            0            38   United-States   <=50K  \n",
       "32558            0            40   United-States   <=50K  \n",
       "32560            0            40   United-States    >50K  \n",
       "\n",
       "[29096 rows x 13 columns]"
      ]
     },
     "execution_count": 423,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2dc7f88f",
   "metadata": {},
   "source": [
    "### 2.3 缺失值处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 424,
   "id": "d319533f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [age, workclass, education, maritalStatus, occupation, relationship, race, sex, capitalGain, capitalLoss, hoursPerWeek, nativeCountry, income]\n",
       "Index: []"
      ]
     },
     "execution_count": 424,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set[df_train_set.isna().values == True] # 输出有缺失值的数据行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 425,
   "id": "c4f703f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train_set.dropna(inplace=True) # 去除空行 "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ac0318d",
   "metadata": {},
   "source": [
    "### 2.4 查看列类型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 426,
   "id": "5beb63f5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age               int64\n",
       "workclass        object\n",
       "education        object\n",
       "maritalStatus    object\n",
       "occupation       object\n",
       "relationship     object\n",
       "race             object\n",
       "sex              object\n",
       "capitalGain       int64\n",
       "capitalLoss       int64\n",
       "hoursPerWeek      int64\n",
       "nativeCountry    object\n",
       "income           object\n",
       "dtype: object"
      ]
     },
     "execution_count": 426,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set.dtypes"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5845bc34",
   "metadata": {},
   "source": [
    "### 2.5 异常值处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 427,
   "id": "0362dee5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>54</td>\n",
       "      <td>?</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>?</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Asian-Pac-Islander</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>60</td>\n",
       "      <td>South</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>32</td>\n",
       "      <td>?</td>\n",
       "      <td>7th-8th</td>\n",
       "      <td>Married-spouse-absent</td>\n",
       "      <td>?</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>?</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>25</td>\n",
       "      <td>?</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>?</td>\n",
       "      <td>Own-child</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>67</td>\n",
       "      <td>?</td>\n",
       "      <td>10th</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>?</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>106</th>\n",
       "      <td>17</td>\n",
       "      <td>?</td>\n",
       "      <td>10th</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>?</td>\n",
       "      <td>Own-child</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>34095</td>\n",
       "      <td>0</td>\n",
       "      <td>32</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32530</th>\n",
       "      <td>35</td>\n",
       "      <td>?</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>?</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>55</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32531</th>\n",
       "      <td>30</td>\n",
       "      <td>?</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>?</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>Asian-Pac-Islander</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>99</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32539</th>\n",
       "      <td>71</td>\n",
       "      <td>?</td>\n",
       "      <td>Doctorate</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>?</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>10</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32541</th>\n",
       "      <td>41</td>\n",
       "      <td>?</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Separated</td>\n",
       "      <td>?</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>32</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32542</th>\n",
       "      <td>72</td>\n",
       "      <td>?</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>?</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>25</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1632 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       age workclass      education           maritalStatus occupation  \\\n",
       "27      54         ?   Some-college      Married-civ-spouse          ?   \n",
       "61      32         ?        7th-8th   Married-spouse-absent          ?   \n",
       "69      25         ?   Some-college           Never-married          ?   \n",
       "77      67         ?           10th      Married-civ-spouse          ?   \n",
       "106     17         ?           10th           Never-married          ?   \n",
       "...    ...       ...            ...                     ...        ...   \n",
       "32530   35         ?      Bachelors      Married-civ-spouse          ?   \n",
       "32531   30         ?      Bachelors           Never-married          ?   \n",
       "32539   71         ?      Doctorate      Married-civ-spouse          ?   \n",
       "32541   41         ?        HS-grad               Separated          ?   \n",
       "32542   72         ?        HS-grad      Married-civ-spouse          ?   \n",
       "\n",
       "         relationship                 race      sex  capitalGain  capitalLoss  \\\n",
       "27            Husband   Asian-Pac-Islander     Male            0            0   \n",
       "61      Not-in-family                White     Male            0            0   \n",
       "69          Own-child                White     Male            0            0   \n",
       "77            Husband                White     Male            0            0   \n",
       "106         Own-child                White   Female        34095            0   \n",
       "...               ...                  ...      ...          ...          ...   \n",
       "32530            Wife                White   Female            0            0   \n",
       "32531   Not-in-family   Asian-Pac-Islander   Female            0            0   \n",
       "32539         Husband                White     Male            0            0   \n",
       "32541   Not-in-family                Black   Female            0            0   \n",
       "32542         Husband                White     Male            0            0   \n",
       "\n",
       "       hoursPerWeek   nativeCountry  income  \n",
       "27               60           South    >50K  \n",
       "61               40               ?   <=50K  \n",
       "69               40   United-States   <=50K  \n",
       "77                2   United-States   <=50K  \n",
       "106              32   United-States   <=50K  \n",
       "...             ...             ...     ...  \n",
       "32530            55   United-States    >50K  \n",
       "32531            99   United-States   <=50K  \n",
       "32539            10   United-States    >50K  \n",
       "32541            32   United-States   <=50K  \n",
       "32542            25   United-States   <=50K  \n",
       "\n",
       "[1632 rows x 13 columns]"
      ]
     },
     "execution_count": 427,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set[df_train_set['workclass'].str.contains(r'\\?', regex=True)] # 查找异常值, 避免与正则表达式的?冲突需要转义"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 428,
   "id": "c9a08cfe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>Self-emp-not-inc</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Divorced</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>11th</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>Private</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Prof-specialty</td>\n",
       "      <td>Wife</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>Cuba</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32554</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>Masters</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32555</th>\n",
       "      <td>22</td>\n",
       "      <td>Private</td>\n",
       "      <td>Some-college</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Protective-serv</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32556</th>\n",
       "      <td>27</td>\n",
       "      <td>Private</td>\n",
       "      <td>Assoc-acdm</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Tech-support</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>38</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32558</th>\n",
       "      <td>58</td>\n",
       "      <td>Private</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Widowed</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Unmarried</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32560</th>\n",
       "      <td>52</td>\n",
       "      <td>Self-emp-inc</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Wife</td>\n",
       "      <td>White</td>\n",
       "      <td>Female</td>\n",
       "      <td>15024</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&gt;50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>27464 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       age          workclass      education        maritalStatus  \\\n",
       "0       39          State-gov      Bachelors        Never-married   \n",
       "1       50   Self-emp-not-inc      Bachelors   Married-civ-spouse   \n",
       "2       38            Private        HS-grad             Divorced   \n",
       "3       53            Private           11th   Married-civ-spouse   \n",
       "4       28            Private      Bachelors   Married-civ-spouse   \n",
       "...    ...                ...            ...                  ...   \n",
       "32554   53            Private        Masters   Married-civ-spouse   \n",
       "32555   22            Private   Some-college        Never-married   \n",
       "32556   27            Private     Assoc-acdm   Married-civ-spouse   \n",
       "32558   58            Private        HS-grad              Widowed   \n",
       "32560   52       Self-emp-inc        HS-grad   Married-civ-spouse   \n",
       "\n",
       "               occupation    relationship    race      sex  capitalGain  \\\n",
       "0            Adm-clerical   Not-in-family   White     Male         2174   \n",
       "1         Exec-managerial         Husband   White     Male            0   \n",
       "2       Handlers-cleaners   Not-in-family   White     Male            0   \n",
       "3       Handlers-cleaners         Husband   Black     Male            0   \n",
       "4          Prof-specialty            Wife   Black   Female            0   \n",
       "...                   ...             ...     ...      ...          ...   \n",
       "32554     Exec-managerial         Husband   White     Male            0   \n",
       "32555     Protective-serv   Not-in-family   White     Male            0   \n",
       "32556        Tech-support            Wife   White   Female            0   \n",
       "32558        Adm-clerical       Unmarried   White   Female            0   \n",
       "32560     Exec-managerial            Wife   White   Female        15024   \n",
       "\n",
       "       capitalLoss  hoursPerWeek   nativeCountry  income  \n",
       "0                0            40   United-States   <=50K  \n",
       "1                0            13   United-States   <=50K  \n",
       "2                0            40   United-States   <=50K  \n",
       "3                0            40   United-States   <=50K  \n",
       "4                0            40            Cuba   <=50K  \n",
       "...            ...           ...             ...     ...  \n",
       "32554            0            40   United-States    >50K  \n",
       "32555            0            40   United-States   <=50K  \n",
       "32556            0            38   United-States   <=50K  \n",
       "32558            0            40   United-States   <=50K  \n",
       "32560            0            40   United-States    >50K  \n",
       "\n",
       "[27464 rows x 13 columns]"
      ]
     },
     "execution_count": 428,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set=df_train_set[~df_train_set['workclass'].str.contains(r'\\?', regex=True)]\n",
    "df_train_set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 429,
   "id": "debec8c4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>39</td>\n",
       "      <td>State-gov</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Never-married</td>\n",
       "      <td>Adm-clerical</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>2174</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>50</td>\n",
       "      <td>Self-emp-not-inc</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Exec-managerial</td>\n",
       "      <td>Husband</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>13</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>38</td>\n",
       "      <td>Private</td>\n",
       "      <td>HS-grad</td>\n",
       "      <td>Divorced</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Not-in-family</td>\n",
       "      <td>White</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>53</td>\n",
       "      <td>Private</td>\n",
       "      <td>11th</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Handlers-cleaners</td>\n",
       "      <td>Husband</td>\n",
       "      <td>Black</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>United-States</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>28</td>\n",
       "      <td>Private</td>\n",
       "      <td>Bachelors</td>\n",
       "      <td>Married-civ-spouse</td>\n",
       "      <td>Prof-specialty</td>\n",
       "      <td>Wife</td>\n",
       "      <td>Black</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>40</td>\n",
       "      <td>Cuba</td>\n",
       "      <td>&lt;=50K</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age          workclass   education        maritalStatus  \\\n",
       "0   39          State-gov   Bachelors        Never-married   \n",
       "1   50   Self-emp-not-inc   Bachelors   Married-civ-spouse   \n",
       "2   38            Private     HS-grad             Divorced   \n",
       "3   53            Private        11th   Married-civ-spouse   \n",
       "4   28            Private   Bachelors   Married-civ-spouse   \n",
       "\n",
       "           occupation    relationship    race      sex  capitalGain  \\\n",
       "0        Adm-clerical   Not-in-family   White     Male         2174   \n",
       "1     Exec-managerial         Husband   White     Male            0   \n",
       "2   Handlers-cleaners   Not-in-family   White     Male            0   \n",
       "3   Handlers-cleaners         Husband   Black     Male            0   \n",
       "4      Prof-specialty            Wife   Black   Female            0   \n",
       "\n",
       "   capitalLoss  hoursPerWeek   nativeCountry  income  \n",
       "0            0            40   United-States   <=50K  \n",
       "1            0            13   United-States   <=50K  \n",
       "2            0            40   United-States   <=50K  \n",
       "3            0            40   United-States   <=50K  \n",
       "4            0            40            Cuba   <=50K  "
      ]
     },
     "execution_count": 429,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#删除有异常值的行\n",
    "new_columns = ['workclass', 'education', 'maritalStatus', 'occupation', 'relationship', 'race', 'sex',\n",
    "               'nativeCountry', 'income']\n",
    "for col in new_columns:\n",
    "        df_train_set = df_train_set[~df_train_set[col].str.contains(r'\\?', regex=True)]\n",
    "df_train_set.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8af9d211",
   "metadata": {},
   "source": [
    "### 2.6 数据可视化，以年龄为例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 430,
   "id": "ec4bab13",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:ylabel='Frequency'>"
      ]
     },
     "execution_count": 430,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_train_set['age'].plot.hist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 431,
   "id": "a03b310e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 431,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_train_set['age'].value_counts().sort_index().plot.line()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 432,
   "id": "31d84131",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\miniconda\\envs\\py37\\lib\\site-packages\\seaborn\\_decorators.py:43: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.\n",
      "  FutureWarning\n",
      "d:\\miniconda\\envs\\py37\\lib\\site-packages\\seaborn\\_decorators.py:43: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.\n",
      "  FutureWarning\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1dd3b0a12c8>"
      ]
     },
     "execution_count": 432,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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amnbtm1q1KiRIiMjlZmZqSFDhiglJUVVq1Y1tp39gOnl5aWxY8fKarUqNjZWISEh8vLykiSVKlVKH3/8sXx8fJSQkGDMd+nSJfXr109t2rRRp06d1KhRIx08eFAODg6aNWuWPD099dprrykhIUHJyclq3ry5IiIiFB8frxEjRsjDw0MeHh6SpA4dOhjfU05Ojo4ePapHH33UqOe0adP0yy+/yGazqUePHmrbtq2eeuop9evXT4GBgXrmmWf0/vvv69VXX9XYsWNVsmRJDRs2TIcOHZKzs7MaN24sX19fvfLKK0pLS1Nubq7OnDmjBx980NiGkZGRys7O1quvvqrz58+rQoUK+uWXX7R582ajHre6/sOGDZODg4Nee+01ZWVl5duWkZGR8vPzU2hoqOLj4zV27FjjRPbaa6/p9OnTKl26tCZPnqycnByNHDlSqampSk5OVteuXRUWFnbdfe+HH34wLlY++ugjRUZGat++fUpPT1eNGjU0adIkY97p06erXLly6t69uy5fvqyePXve8K7v9u3bjXAgMzNTkydPlouLiwYOHKgyZcro3Llzat68uQYNGnTT7dhiseiZZ54ptO1J0oYNG/TVV1/p0qVLGjhwoFq1aqUmTZrop59+Unh4uOrUqaPDhw8rLS1NM2bMUKVKlTRt2rR8630z6zB48GD16dNHP//8s1577TXNnTtXu3fv1uzZs/Xpp5/q7NmzatWq1U2tU2RkZKEXSC1btlT16tVVvXp1de3a9Q+VValSJa1cuVJBQUFq1KiRwsPDZX9H8tq1a7VkyRK5urqqWrVqev311xUXF6fMzEyFhobKarXq6aefVsWKFbVmzRqdPXtW9erVk3Rlv/T29pa3t7cqVKigs2fPKi8vTxEREbr//vvVsWNHVatWTa6urkpOTtaBAwe0fPlyNWnSRCNHjlROTo4cHBw0atQo1alT57rtKSMjQ3l5eXJzczP2jSeffFIhISE6duyYcnNzNWTIEJ07d06ff/65Ll26JDc3N/Xt21cpKSmFnme+//574/utW7euypQpo+PHjys0NFROTk7y9PQ0jkGFbaerXduOJk2aVOT5zWq16vHHH5eTk5N+++03lSlTRsuWLTPa16BBg1ShQgWdOnVKjz76qA4fPqz9+/erRYsWcnFx0fHjx/X0008XaJeXLl2SpHzrVaNGDZ05c0Zjx47VgQMH5OrqKovFoosXL+rIkSOFtm/pysXPxIkT9cEHH0iSnn/+eQ0cOFAnTpzQ0qVL87Wt559/XjNmzDDOw05OTho0aJBOnTqljh07ys3NTY6Ojpo5c6aWLFmi77//Xh4eHmrevLmmTp2qL7/8UosXL9aJEycUFBQkLy8vJSUladiwYfLx8dGIESP0yiuvaO7cudq/f79+//13Y98dMmSIgoODdejQIfn7+6t06dLasWOHXF1dNW/ePElX7sJ9+eWXyszMlLu7u5YvX67PP/9cWVlZevXVV3XhwgWNGDFCjRo1Us+ePXXq1Ck99NBDSk9P1+OPP67Tp0+rVq1aatu2rbZs2aL9+/crLS1NZcuWVUREhDp06KClS5fqk08+kaOjo4KCgjR06FBjG6WlpRU4Prdv317du3fXF198IUlat26d/Pz8jAvq7OxsjRw5Unl5edq/f7/KlSsnHx8fDRw4UI0bNy70nOLt7a1x48Zp165d+vbbb7Vo0SLNnj1bq1at0pNPPqlTp05p8ODBWrFihbZv3663335bTk5OqlKlil5//XXNmTPHaBM2m63QtvvVV1/l+/5nzJihw4cPa+HChbJardq8ebPOnDkjFxcXZWVlqVevXoqJiZHVapWbm5vGjx+fb78pqrz58+fLxcVFu3fvVsOGDY3z4EsvvaRz584pOjpaKSkp+t///pdvn/zss8+0atUq5eXl6fnnnzfOcVOmTNHQoUONO8AhISGaPn26PD09NWTIEGVlZcnf319bt27VN998U6Be//nPf4o8NhV13i+sH/v555+rUaNGBc41H3/8saKjo5WXl6fWrVtrwIABxrlLunKnu1u3bqpXr57Rlvbv36+2bduqXLly2rFjhyZOnKgSJUrI0fHKAOlWrVqpW7duWr9+vc6fP686depozpw56tKli86cOSOr1arHHntMr7322g372vv379e8efPk4uKihIQEdevWTV999ZWSk5Nls9kUFhamr776SkeOHNHgwYOVmJio7t276z//+Y/S0tIUHh6udu3aaerUqfL29lZWVpZq1aqlOXPmGO1237598vPz0+nTpzV79mxlZGQY5719+/Zp//79qlGjhlq2bKmcnBzt2LFD58+fV7Vq1fTGG29o3759+uqrr+Tk5FTgOOzn56fq1asb23vPnj3y9vbW3Llz9dNPP2nx4sW6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VqtOnz6t8+fPKzk5WXXr1tXx48c1b948RUVFyd/fX7GxsUpMTJTVatW0adN08uRJpaamKjQ0VG+99ZY8PDy0aNEiLVy4UAMGDNADDzyg7OxszZ8/X6dPn9alS5cUGRmpxYsXq27dusrOztZPP/1kHKNXrlypQYMGaePGjbJYLOrfv78WLFggb29vjR07Vunp6erYsaOWLl2qHTt2KCgoSEuXLlV2draOHDki6UqI8sEHH2jChAlKTk7W/PnzFRsbq7Vr1yo6OlouLi7auHGj1qxZo0qVKql58+bq0KGDUlNTFR0drdq1ayszM1OJiYmqWrWqOnTooIULF6p8+fJ65513dPHiRa1evVojR47U8uXLVaVKlXxDxws7Pvv6+qp27drasWOHcnNztXv3bi1ZssS4oD569Ki6du2qu+++W507d1a5cuU0Y8YMI7Qo7JyyYcMGXbp0SV988YXKlCmj06dPKysrSz///LPatm1r1Mdms2n06NGaOXOmPvzwQ5UrV05r1qzRCy+8oJo1axqPxRXWdq/9/u0B/eXLl9W2bVuNHTtWly9f1po1a7R69WotWLBA4eHhioqKUu/evQs8BlJUeWfOnFFkZKS6du2q77//3hgSXaJECa1YsUJ16tRRXFxcofukj4+PoqOj853j7MHbtebMmaPWrVvrww8/VPv27Y3O/LX1OnHihL788ktt3brVGHptb19Fnfel/P3Y6tWr6+zZsxo6dKhRxk8//aSkpCTNnz9fH330kVavXq3U1NQCj+gU1pZq1aqlH3/8UZI0btw4OTo6Kjs7WwcOHJAkZWdna/369Vq2bJkee+wxJSUlafXq1SpXrpw6deqkbdu2GRf0N+prS1eCmMjISI0dO1azZ89W27Zt5e7ubhzPp0yZIunKDY1SpUrle+zVZrPp0qVLKlWqlN5991395z//kaura752u3LlSk2cOFFnz56VpHznvfLly+ubb76RdOXcGBwcrM6dO+vZZ59V7dq1tXr1aq1Zs0b33ntvkf0Yu7y8PGVmZqpnz55auHCh4uLitHPnTklXzlk9evRQu3btjP69p6enli1bpiZNmqhs2bJyd3cvdBnVq1fXsmXLjDDx2nn27t2rDh06qGrVqvr666917tw5xcfHKzc3VwsXLlTdunXVpk0bZWZmGn2Rr7/+Wjt37lRaWpo2btyoFi1ayMPD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",
      "text/plain": [
       "<Figure size 1296x648 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_train_set = df_train_set.reset_index(drop=True) #重置索引\n",
    "df_train_set['nativeCountry'].isnull() == True\n",
    "s=df_train_set['nativeCountry'].value_counts()\n",
    "k=df_train_set['nativeCountry'][df_train_set['income']==' >50K'].value_counts()\n",
    "sns.set_style(\"whitegrid\")\n",
    "f, ax = plt.subplots(figsize=(18, 9))\n",
    "sns.set_color_codes(\"pastel\")\n",
    "sns.barplot(s.index,s.values,label='total',color=\"b\")\n",
    "sns.barplot(k.index,k.values,label='income>50K',color=\"g\")\n",
    "ax.legend(ncol=2, loc=\"upper left\", frameon=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 433,
   "id": "c0c7e31e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "d:\\miniconda\\envs\\py37\\lib\\site-packages\\seaborn\\_decorators.py:43: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.\n",
      "  FutureWarning\n",
      "d:\\miniconda\\envs\\py37\\lib\\site-packages\\seaborn\\_decorators.py:43: FutureWarning: Pass the following variables as keyword args: x, y. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.\n",
      "  FutureWarning\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1dd3d958b88>"
      ]
     },
     "execution_count": 433,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBIAAAIHCAYAAAAik3/UAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAA+1ElEQVR4nO3dfXRV5Z0v8N85iQkaQq0v1zqDWLAwYi2FyoRWryitI+rSO1OLGYniWG0r1NaCfQGRlzoq1qtl2jrjqF3O6l1QSyk6nU5dc+8o1eJbwWGu1TIwKmM7FVuKqCXJlQDJvn+4yGA8SZ6d95DP5y9zsn95nnP4uU/ON8/eTyHLsiwAAAAAEhT7ewIAAADA4CFIAAAAAJIJEgAAAIBkggQAAAAgmSABAAAASCZIAAAAAJKV9+fgzzzzTFRWVvbnFAAAAIA2mpqaYuLEiSW/12mQsHfv3liwYEFs27YtisVi3HjjjVFeXh4LFiyIQqEQY8eOjaVLl0axWIzVq1fHqlWrory8PObMmRPTpk3r8GdXVlbG+PHju/SkAAAAgN6xefPmdr/XaZDw05/+NPbt2xerVq2KJ554Ir7xjW/E3r17Y+7cuTFlypRYsmRJrF27NiZOnBgrVqyI+++/P5qamqKuri5OO+20qKio6NEnAwAAAPSfTu+RMHr06Ghubo6WlpZoaGiI8vLy2LRpU9TU1ERExNSpU+PJJ5+MZ599NiZNmhQVFRVRXV0do0aNii1btvT6EwAAAAD6TqcrEg477LDYtm1bnHvuufH666/HXXfdFU8//XQUCoWIiKiqqor6+vpoaGiI6urq1rqqqqpoaGjo8Gc3NTV1uFwCAAAAGFg6DRK+853vxH//7/89vvjFL8ZvfvOb+Iu/+IvYu3dv6/cbGxtjxIgRMXz48GhsbHzb4wcGC6WUukfC3r174+WXX47du3fnfS7QZcOGDYuRI0fGIYcc0t9TAQAA6HfdukfCiBEjWj9cvetd74p9+/bFSSedFOvXr48pU6bEunXr4sMf/nBMmDAhvvGNb0RTU1Ps2bMntm7dGuPGjcs92Zdffjmqq6vjve99b+uqB+hNWZbFzp074+WXX47Ro0f393QAAAAGtE6DhMsvvzwWLlwYdXV1sXfv3pg3b16cfPLJsXjx4li+fHmMGTMmpk+fHmVlZTFr1qyoq6uLLMti3rx5Xdracffu3UIE+lShUIgjjzwyduzY0d9TAQAAGPAKWZZl/TX45s2b33FpQ6nHoC/oPQAAgLd09Pmo010b+ltzS8/mHJ39vKampvjBD37Q7veffvrpDnejeOCBB+L222/v8vw6sq+luc9/3rp16+L73/9+j47bE2bPnh0XX3xxzJo1Kz71qU9FRMRrr70WV1xxRdTV1cXcuXPjzTffjIiIj370o9HU1BQRETt27IgLLrgg/uEf/qHf5g4AADCYdXppQ38rKxZizYaeW3I+o+boDr+/Y8eO+MEPfhAXXXRRye/ff//9cd5558WJJ57YY3NKVV4si7tfWNVjP++qsRd3eszUqVN7bLy8Xn/99XjkkUfivPPOi2HDhr3te//5n/8ZDz744Nsugbnzzjvj/PPPjwsvvDDuueee+P73vx+XX3556/e3b98en/70p+MLX/hCnHXWWX31NAAAAA4qAz5I6Gt33XVXvPjii/HXf/3X8dxzz0VDQ0M0NzfHF77whaiuro7HHnssNm3aFO973/viJz/5SfzzP/9z7Nu3L6qrq+OOO+7o7+n3uAceeCAee+yxeOWVV+I973lP/PrXv44PfOADccMNN8TOnTtjwYIFUV9fH1mWxa233hpHHHFEfPnLX37b6/aRj3wkLrjggpg8eXI8//zzMXr06DjyyCPjX/7lX6KioiLuueee2L17d1x//fXx+uuvR0TEokWLYvTo0fH73/8+PvnJT8b48eOjtrY2TjzxxHj11Vdj165dMXv27Ni1a1d85jOfiWnTpsXGjRvjqquuioi3ApDly5e3BgmvvPJKXH311bFo0aI49dRT++vlBAAAGPQECW3Mnj07nn/++WhsbIxTTz01/uIv/iK2b98eM2fOjIcffjhOP/30OO+88+I973lPvPHGG/Gd73wnisViXHnllfHcc8/19/R7zS9/+cu4995749BDD42zzjorduzYEXfffXd89KMfjZkzZ8ZTTz0Vzz77bGzevLnk69bY2Bjnn39+nHLKKXHOOefEddddF/PmzYtLL700Xnzxxfjxj38cH/7wh6Ouri5++ctfxnXXXRff+9734pOf/GR88pOfjH/913+Na6+9NqZNmxaXXnppXHHFFXHZZZfF73//+5g5c2ZMmDAhGhoaWrccraqqivr6+tb5X3PNNTFs2LDYuXNnf72EAAAABwVBQju2bt0a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Zc3NzVlDQ0P2rW99K7nXStXmOaeVqk/ttVK1qX1WqjbL0s9ppepTe61UbZ5zWntzz7LOe61UbZ5zWqn6PL2231e/+tVs1apVud8/29bn6bW2tXnfP9vW53n/bFubZfneP9vW5zmvta3N+/7Zdt5ZlnZOK1Wfp9fa1ubps4ceeii75pprsizLsscffzz73Oc+l9xrpWrz9Fmp+tReKVWbZWm9smLFimzRokVZlmXZ1q1bsyuuuKLL/39lWZYNmEsbRo0aFXfccUfr19u3b48PfehDEfHWtpIbN25st/acc86JL3zhC61fl5WVRWNjY3z+85+PP/3TP+1w3FK1y5cvj/Hjx0fEW3+VrKyszFV/xx13xB//8R/Hnj17YseOHXHkkUcm177++utx++23x8KFCzucd3v1v/jFL+LRRx+NSy65JBYuXBgNDQ3Jtf/6r/8a27dvj8svvzz+8R//MWpqanKNvd8dd9wRl156afy3//bfkmvHjx8fb7zxRmRZFo2NjVFe3v5imVL1qf1y1llnxY033hgREa+88kocddRRsWnTptbnOnXq1HjyySfbHbtUfWqvlapN7bVStal91l59aq+Vqk3ts/bqU3utVO1+nfVZe/WpvVaqNs956dZbb42LL764dX55+qxUfWqflarNc04rVZ+n19rW5jmnlarP02tta/Oc00rV75fSa21r85zT2tbm6bMtW7bEm2++GVdccUVcdtll8cwzz+TqtVL1qb1WqjZPr5WqT+21UrWpvVaqNk+flapP7bVStful9Fmp+tReK1Wbp9cef/zxGDduXFx99dUxe/bsOPPMM5N7rVRtnnNaqfrUXitVm9pnpWrznNNK1af2WqnaPOe0UvX7ddZrpWrznNNK1efptYiI5557Ll588cX48z//89zvn23r8/Ra29q8759t6/O8f7atzfv+2bY+z3mtbW3e988Da/dLOaeVqs/Ta21r8/TZ6NGjo7m5OVpaWqKhoSHKy8uTe61UbZ4+K1Wf2iulalN75cUXX4ypU6dGRMSYMWNi69atXfr/a78BEyRMnz79bY1y3HHHxYYNGyIi4pFHHok333yz3dqqqqoYPnx4NDQ0xDXXXBNz586N4447Lj74wQ92Om6p2gN/CV25cmVcfvnluerLyspi27Ztcf7558frr78eo0ePTqr9whe+ENdff30sXLgwqqqq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",
      "text/plain": [
       "<Figure size 1296x648 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出年龄与收入的关系\n",
    "\n",
    "df_train_set = df_train_set.reset_index(drop=True) #重置索引\n",
    "df_train_set['age'].isnull() == True\n",
    "s=df_train_set['age'].value_counts()\n",
    "k=df_train_set['age'][df_train_set['income']==' >50K'].value_counts()\n",
    "sns.set_style(\"whitegrid\")\n",
    "f, ax = plt.subplots(figsize=(18, 9))\n",
    "sns.set_color_codes(\"pastel\")\n",
    "sns.barplot(s.index,s.values,label='total',color=\"b\")\n",
    "sns.barplot(k.index,k.values,label='income>50K',color=\"g\")\n",
    "ax.legend(ncol=2, loc=\"upper left\", frameon=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f8ccedf7",
   "metadata": {},
   "source": [
    "### 2.7 连续型变量处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 434,
   "id": "ba523716",
   "metadata": {},
   "outputs": [],
   "source": [
    "continuous_column = ['age', 'capitalGain', 'capitalLoss', 'hoursPerWeek']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 435,
   "id": "8beefdd4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4356 0\n"
     ]
    }
   ],
   "source": [
    "# df_train_set['age'].max(), df_train_set['age'].min()\n",
    "# print(df_train_set['capitalGain'].max(), df_train_set['capitalGain'].min())\n",
    "print(df_train_set['capitalLoss'].max(), df_train_set['capitalLoss'].min())\n",
    "# df_train_set['hoursPerWeek'].max(), df_train_set['hoursPerWeek'].min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 436,
   "id": "e215575c",
   "metadata": {},
   "outputs": [],
   "source": [
    "bins = [0, 25, 50, 75, 100]  # 分箱区间左开右闭 (0, 25], (25, 50], ...\n",
    "bins1 = [-1, 1, 1000000]\n",
    "bins2 = [-1, 1, 4000]\n",
    "df_train_set['age'] = pd.cut(df_train_set['age'], bins, labels=False)\n",
    "df_train_set['capitalGain'] = pd.cut(\n",
    "    df_train_set['capitalGain'], bins1, labels=False)\n",
    "df_train_set['capitalLoss'] = pd.cut(\n",
    "    df_train_set['capitalLoss'], bins1, labels=False)\n",
    "df_train_set['hoursPerWeek'] = pd.cut(\n",
    "    df_train_set['hoursPerWeek'], bins, labels=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 437,
   "id": "0edf5ccd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0        0\n",
      "1        0\n",
      "2        0\n",
      "3        0\n",
      "4        0\n",
      "        ..\n",
      "26899    0\n",
      "26900    0\n",
      "26901    0\n",
      "26902    0\n",
      "26903    0\n",
      "Name: capitalLoss, Length: 26904, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(df_train_set['capitalLoss'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e6e9650",
   "metadata": {},
   "source": [
    "### 2.8 离散型变量处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 438,
   "id": "c31eef6e",
   "metadata": {},
   "outputs": [],
   "source": [
    "discrete_column = ['workclass', 'education', 'maritalStatus', 'occupation', 'relationship', 'race', 'sex', 'nativeCountry', 'income']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 439,
   "id": "51497367",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       " Private             19214\n",
       " Self-emp-not-inc     2431\n",
       " Local-gov            2014\n",
       " State-gov            1253\n",
       " Self-emp-inc         1049\n",
       " Federal-gov           929\n",
       " Without-pay            14\n",
       "Name: workclass, dtype: int64"
      ]
     },
     "execution_count": 439,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set['workclass'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 440,
   "id": "8ac74e85",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0            State-gov\n",
       "1     Self-emp-not-inc\n",
       "2              Private\n",
       "3              Private\n",
       "4              Private\n",
       "Name: workclass, dtype: object"
      ]
     },
     "execution_count": 440,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set['workclass'].head() #展示前五条"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 441,
   "id": "612dce08",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index([' <=50K', ' >50K'], dtype='object')"
      ]
     },
     "execution_count": 441,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# df_train_set['workclass'].value_counts().keys()\n",
    "# df_train_set['education'].value_counts().keys()\n",
    "# df_train_set['maritalStatus'].value_counts().keys()\n",
    "# df_train_set['occupation'].value_counts().keys()\n",
    "# df_train_set['relationship'].value_counts().keys()\n",
    "# df_train_set['race'].value_counts().keys()\n",
    "# df_train_set['sex'].value_counts().keys()\n",
    "# df_train_set['nativeCountry'].value_counts().keys()\n",
    "df_train_set['income'].value_counts().keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 442,
   "id": "4cc1ac80",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 442,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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cnH55Zczd+5cKisr+ec//xn1tifjlVde4eyzz6asrCzy7/333498vnHjRl588cUe7buqqop77rmn1zb+6Ec/Yty4cTz99NMRW2pqapgwYQKvvPJKZL2zzjqr3bavvPJKq/O54447ImWvY21nd3j88cc5//zzKSsr44wzzqCkpIRNmza1W+8Pf/jDSe/3tnR0/oqisGHDhl7b25aW9peVlXHFFVd0aP/JePfddzl27Fi3jtnynr/vvvuorKzs1vYno7a2NnIe06ZN47LLLqOsrCzq67Zp0ybmz58fE1viQUx8hZpAFi9erD788MPqwoULO/x8165d6lVXXRWTYx08eFCdPXt2TPalsXnzZvXKK69UPR6PevDgQfXHP/6xet5556k7d+6MavvPPvtMvfnmm1VVVdWXX35Zfeihh3ptU6z2E0++9a1vqRdccIH67LPPRpY9//zz6jnnnKO+/PLLkWVnnnlml/tauHCh+uGHH8bDzG6xcuVKde3atZG/d+3apV566aW92mdH5x+P+1hVe2//VVddpe7atatbx0zEvdoTuz799FN13rx5cbKo98TiuiWs1ZPX6+XTTz/lrbfeYtasWdTW1pKfn8/x48e5/fbbUVWVfv36RdafNWsW06ZNY8eOHYwcOZKCggI+//xzTCYTf/jDHzAaja32v2rVKt577z1CoRClpaV897vfjXz273//m9/97nfo9XqGDh3Kb3/7W9544w1efvllwuEwt956K7fffjsfffQRX3/9Nffddx+qqjJgwAAefvhhtmzZwn//93+ze/dusrOzOX78OEajEYPBwIYNG8jJyeHxxx/nyy+/pKGhgfvuu4/XXnuNb775Bq/Xy+jRo7n33ntZtmwZx48f5/e//z1/+9vf8Pl8TJ48mXPOOSdi6yuvvNLKLqfTyXPPPYdOp2Pq1KncfvvtPP744+zZs4eamhoOHDjAtGnTAFizZg3/+Mc/CAaDGI1GZFnm8OHD1NXVceutt/LCCy9w8OBBhgwZQlFRESNHjmT//v3U1dVRX1/PnDlz+Mc//sHevXtZsWIFhYWF/OpXv2L9+vXMmjWL008/ne3btyNJEqtWrSI7O5t7772Xb775hsLCQg4fPsyTTz7JkCFDIudzzz33oCgK4XCYtWvXUl1dzS233MITTzyByWTiiSeeYODAgbz55pvU1dVx+umnY7FYOPXUU/n1r3/NL37xC3Q6HTk5OdhsNvbv388//vEP8vLyyM3N5Ze//CVPP/00+/bt4wc/+AF/+9vf+OlPf9rKTpvNxiOPPMJnn32GqqpcffXVXHjhha3un0AgwKJFizh48CChUIhrrrmGiy66iLKyMkaOHMnevXtRVZXf/e53re5TgO9///vcf//9HDt2jLvuuovXXnsNvV7PzJkzMZlMHDt2jG3btpGXl8ett97KkCFD+PnPf86sWbPYuXMnubm5PProoyiKwtlnn43L5UKn0/Hkk0+yYcMGvvnmG2bOnMmAAQO47bbbOOOMM/j+97/PO++8gyzLPPzww4waNYqzzz6befPmoaoqgUCAe++9l3HjxrF69WrefPNNJEnioosu4mc/+1kr+2tra7n99ts5ePAgV1xxBYcOHWLcuHH4/X7cbjcHDx4kLy+PU045BZvNRlVVFdu2bePKK6/k17/+NT6fj1dffZU9e/bwq1/9ip/97Gfs27ePJUuWEAgEMJvNPPLII/zhD3+I3PPPPfcc99xzDwsWLGDlypUMGTKEd955h82bN3PbbbexePFi6urqAFiyZAnjxo1rZfM//vEPnnnmGQwGA4MHD+bBBx/E6/Wyc+dOFi5ciMVi4aqrrmLNmjV89dVX2Gw2Zs6cyaZNmzjzzDPZtm0bR48eZcaMGVxyySXs37+f6667jtraWmbOnMktt9zS6nh79+7lzjvvxGAwoNfrefDBB9m3bx/l5eX87ne/A5reyD766CPuuOMOVFXlyJEjNDQ0sGLFCmRZ5rbbbqNfv34cO3aMGTNmMH/+fA4dOsTixYsJBoNIksSSJUsYP348M2fOZNSoUYwYMYKPPvqoQ1/RHRKWunn77bc577zzkGWZCy+8kJdeegmAZ599losvvpjVq1dz7rnnRtb3er1cfPHFvPDCC3z++edMmTKFF154gUAgwK5du1rte9u2bWzcuJENGzZQXl7Orl27UJsn/KqqytKlS/nv//5v1qxZw4ABA3j11VcByMnJYd26dZxxxhmRfS1dupTly5ezYcMGzjjjDHbv3s3OnTt56KGHGD9+PN/97ndbpWtyc3MjzcJHjRpFeXk5AwYMICcnh2effZby8nK++uor6urqWLRoEd/5zneYN28e119/PRdffHGHX5xmV3FxMY8//jjPPfcc69at49ixY3z00UcAmM1mnn/+eS6//HLeeecdrrrqKv785z9jt9tZu3YtHo+H6dOnc+2113LWWWfx17/+laqqKvLy8njwwQd59NFHI/v505/+xA9+8AM+/PBDnnrqKa6//nreeuutVjZ5vV5++MMfsmbNGvr378/GjRt5//33cTqdvPTSS9x///0cOXKk3bncc889yLLM1VdfjdFoxOVy8emnnwJwwQUXcMUVV1BZWclpp52GJEmUl5fj8/nweDzcfffdTJ06leuuu46ZM2dy4MABvv3tb/Pzn/8cp9PJVVddxYMPPsiVV17JmDFjmDJlCqFQqJ2dH374IYcOHaK8vJznn3+ep556CpfL1crOF198kby8PMrLy3n22Wf5/e9/T21tLdDUJW316tVceOGFPP3005FtnnvuOcrKyqiurub5559n8uTJDBo0CL/fz2233UZ2djaBQICKigruuusuTj31VEKhEK+++ipms5lZs2axbt06Ro0axYsvvojX6+V73/seX3zxBcOHD+fdd9/FZDIxYMAAPvjgAx577DEWL15MOBxud50BtmzZgs1m45lnnmHJkiV4PB527drF22+/zdq1a1m7di3vvfcee/bsaWX/1VdfTVVVFWvWrGHJkiVUV1dz0003EQwGGTp0KA888ACDBg3i5z//OV988QUXX3wxU6dO5YEHHuDFF1/k7bff5oILLuDXv/51ZP8rVqzg+uuv58UXX+Tyyy+noqKiw3v+sssu47XXXgPg1VdfpaSkhKeeeorvfOc7rF69mmXLlnWYlnvzzTe5+uqrWbduHd/97nfxeDw89dRT5OTksGLFCpYtW8Ydd9zB3XffTSAQ4Je//CWFhYWMGzcOh8PBSy+9RF5eHjabDWhKka1atYoXXniBNWvWtDvexx9/zIQJE3j22We54YYbqK+v7/A70Bg6dCjPP/88t9xyCw899BAAhw8f5oEHHuCll17i008/ZevWrTz44IOUlZXxwgsvsHjxYhYtWgTAkSNHePjhh1m6dGmnviJaEhbRb9iwAb1ez7XXXovP5+Po0aNcd9117Ny5k0suuQRoeqDWrVsX2WbChAlAk+MbPXp05P+KorB48WIOHDhAXl4e559/PpMmTUKv12OxWFiyZAmHDh0CmqKV48ePM2/ePKCpg/tZZ53FsGHDGDlyZDs7a2pqIse68sorgaaLft9993Ho0CGqq6tb/SBt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w+Hg5z//OYcPH2b69OkMHz4ci8XCT37yE0wmEwMHDuT5558nOzsbvV5PMBiMRBOx4uyzz2bjxo1cccUVFBYWYjab242dtMRsNmO1Wpk8eTKfffYZX3zxBVlZWcydO5e33noLp9PJPffcw/Dhw1EUhSuuuILHHnuMr776itzcXAYNGtRunxMmTKC8vJw9e/bwz3/+s8Mfru9///v8+9//Zs6cOTQ0NHDuueeSnZ3dap2SkhKWLl1KaWkpiqJw8803U1BQADSlFJ577jksFgsPPvhgt66R2WymtraWSy+9FIPBQCgUYvbs2bzxxhs888wzVFZWMmjQIObPn89TTz3FoUOHuOqqq9i1axe33XYb55xzDm+//Tbf+973KCws5Le//S0Gg4HrrruO66+/nsGDB5OTkwM0RYzz58/nL3/5Czqdjptuuonx48dzxhlnUFpait/vZ9KkSe1+nNpuZ7FYItu99dZbLFiwgKysLAYNGsSUKVOApkj1N7/5DatWrYq8Sf7kJz+J7P83v/kNd911F08++SRms5mHHnqIysrKyD3fktmzZ3PddddFIt8bbriBxYsXs379ejweT4eKuEmTJnHNNddgt9uxWq2cffbZnH322bz22mssXLgwMs6ycOFCnE4njzzyCPfddx8jRoxg7dq1fPDBBxw9ejTyVtcVEydOZMGCBTz++OPodDruvPNOxo0bh81mY/bs2YwePbqV/9JSm+FwmOXLlwNgNBq57bbbqK6u5oILLmD8+PH85je/YenSpfz5z38mGAy2CmA1ovEVXdKroVxBUmirmEgWu3btUt98801VVVW1trZWPfPMM1VFURJqw1//+ld13759qqqq6vr169U77rgjpvvviYojGmbOnKn6fL6Y71eQfDpShsVLPRUtCcvRCzKPgQMH8vDDD/OXv/yFUCjE7bffHnmTSqQN8+fPx2KxoNPpIlGhQCA4gahHLxAIBBmOKIEgEAgEGY5w9AKBQJDhCEcvEAgEGY5w9AKBQJDhCEcvEAgEGc7/B2SXKYZCYz3MAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_train_set['occupation'].value_counts().sort_index().plot.line()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 443,
   "id": "9509c2db",
   "metadata": {},
   "outputs": [],
   "source": [
    "workclass_mapping = {' Private': 0, ' Self-emp-not-inc': 1, ' Self-emp-inc': 1, ' Local-gov': 2,\n",
    "                     ' State-gov': 2, ' Federal-gov': 2, ' Without-pay': 3, ' Never-worked': 3}\n",
    "df_train_set['workclass'] = df_train_set['workclass'].map(workclass_mapping)\n",
    "\n",
    "education_mapping = {' HS-grad': 0, ' Some-college': 0, ' Bachelors': 0, ' Masters': 1, ' Assoc-voc': 2,\n",
    "                     ' Assoc-acdm': 2, ' 11th': 3, ' 10th': 3, ' 7th-8th': 3, ' Prof-school': 2, ' 9th': 3,\n",
    "                     ' Doctorate': 2, ' 12th': 3, ' 5th-6th': 3, ' 1st-4th': 3, ' Preschool': 3}\n",
    "df_train_set['education'] = df_train_set['education'].map(education_mapping)\n",
    "\n",
    "maritalStatus_mapping = {' Married-civ-spouse': 0, ' Never-married': 1, ' Divorced': 1, ' Separated': 2,\n",
    "                         ' Widowed': 2, ' Married-spouse-absent': 2, ' Married-AF-spouse': 2}\n",
    "df_train_set['maritalStatus'] = df_train_set['maritalStatus'].map(\n",
    "    maritalStatus_mapping)\n",
    "\n",
    "occupation_mapping = {' Prof-specialty': 0, ' Exec-managerial': 0, ' Adm-clerical': 2, ' Craft-repair': 1,\n",
    "                      ' Sales': 1, ' Other-service': 2, ' Machine-op-inspct': 2, ' Transport-moving': 2,\n",
    "                      ' Handlers-cleaners': 2, ' Farming-fishing': 2, ' Tech-support': 2,\n",
    "                      ' Protective-serv': 2, ' Priv-house-serv': 3, ' Armed-Forces': 3}\n",
    "df_train_set['occupation'] = df_train_set['occupation'].map(occupation_mapping)\n",
    "\n",
    "relationship_mapping = {' Husband': 0, ' Not-in-family': 1, ' Own-child': 2, ' Unmarried': 1, ' Wife': 1,\n",
    "                        ' Other-relative': 2}\n",
    "df_train_set['relationship'] = df_train_set['relationship'].map(\n",
    "    relationship_mapping)\n",
    "\n",
    "race_mapping = {' White': 0, ' Black': 1, ' Asian-Pac-Islander': 1, ' Amer-Indian-Eskimo': 2,\n",
    "                ' Other': 2}\n",
    "df_train_set['race'] = df_train_set['race'].map(race_mapping)\n",
    "\n",
    "sex_mapping = {' Male': 0, ' Female': 1}\n",
    "df_train_set['sex'] = df_train_set['sex'].map(sex_mapping)\n",
    "\n",
    "nativeCountry_mapping = {' United-States': 0, ' Mexico': 1, ' Philippines': 1, ' Germany': 1, ' Puerto-Rico': 1,\n",
    "                         ' Canada': 1, ' India': 1, ' El-Salvador': 1, ' Cuba': 1, ' England': 1, ' Jamaica': 1,\n",
    "                         ' South': 1, ' China': 1, ' Italy': 1, ' Dominican-Republic': 1, ' Vietnam': 1,\n",
    "                         ' Guatemala': 1, ' Japan': 1, ' Poland': 1, ' Columbia': 1, ' Iran': 1, ' Taiwan': 1,\n",
    "                         ' Haiti': 1, ' Portugal': 1, ' Nicaragua': 1, ' Peru': 1, ' Greece': 1, ' France': 1,\n",
    "                         ' Ecuador': 1, ' Ireland': 1, ' Hong': 1, ' Cambodia': 1, ' Trinadad&Tobago': 1,\n",
    "                         ' Thailand': 1, ' Laos': 1, ' Yugoslavia': 1, ' Outlying-US(Guam-USVI-etc)': 1,\n",
    "                         ' Hungary': 1, ' Honduras': 1, ' Scotland': 1, ' Holand-Netherlands': 1}\n",
    "df_train_set['nativeCountry'] = df_train_set['nativeCountry'].map(\n",
    "    nativeCountry_mapping)\n",
    "\n",
    "income_mapping = {' <=50K': 0, ' >50K': 1}\n",
    "df_train_set['income'] = df_train_set['income'].map(income_mapping)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 446,
   "id": "7c7c3d0f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>workclass</th>\n",
       "      <th>education</th>\n",
       "      <th>maritalStatus</th>\n",
       "      <th>occupation</th>\n",
       "      <th>relationship</th>\n",
       "      <th>race</th>\n",
       "      <th>sex</th>\n",
       "      <th>capitalGain</th>\n",
       "      <th>capitalLoss</th>\n",
       "      <th>hoursPerWeek</th>\n",
       "      <th>nativeCountry</th>\n",
       "      <th>income</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26899</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26900</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26901</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26902</th>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26903</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>26904 rows × 13 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       age  workclass  education  maritalStatus  occupation  relationship  \\\n",
       "0        1          2          0              1           2             1   \n",
       "1        1          1          0              0           0             0   \n",
       "2        1          0          0              1           2             1   \n",
       "3        2          0          3              0           2             0   \n",
       "4        1          0          0              0           0             1   \n",
       "...    ...        ...        ...            ...         ...           ...   \n",
       "26899    2          0          1              0           0             0   \n",
       "26900    0          0          0              1           2             1   \n",
       "26901    1          0          2              0           2             1   \n",
       "26902    2          0          0              2           2             1   \n",
       "26903    2          1          0              0           0             1   \n",
       "\n",
       "       race  sex  capitalGain  capitalLoss  hoursPerWeek  nativeCountry  \\\n",
       "0         0    0            1            0             1              0   \n",
       "1         0    0            0            0             0              0   \n",
       "2         0    0            0            0             1              0   \n",
       "3         1    0            0            0             1              0   \n",
       "4         1    1            0            0             1              1   \n",
       "...     ...  ...          ...          ...           ...            ...   \n",
       "26899     0    0            0            0             1              0   \n",
       "26900     0    0            0            0             1              0   \n",
       "26901     0    1            0            0             1              0   \n",
       "26902     0    1            0            0             1              0   \n",
       "26903     0    1            1            0             1              0   \n",
       "\n",
       "       income  \n",
       "0           0  \n",
       "1           0  \n",
       "2           0  \n",
       "3           0  \n",
       "4           0  \n",
       "...       ...  \n",
       "26899       1  \n",
       "26900       0  \n",
       "26901       0  \n",
       "26902       0  \n",
       "26903       1  \n",
       "\n",
       "[26904 rows x 13 columns]"
      ]
     },
     "execution_count": 446,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_set['workclass'].head()\n",
    "df_train_set.to_csv('./after_train_adult.csv', index=False)\n",
    "df_train_set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 469,
   "id": "855022ce",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['age', 'workclass', 'education', 'maritalStatus', 'occupation', 'relationship', 'race', 'sex', 'capitalGain', 'capitalLoss', 'hoursPerWeek', 'nativeCountry', 'income']\n"
     ]
    }
   ],
   "source": [
    "print(list(df_train_set))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2478d806",
   "metadata": {},
   "outputs": [],
   "source": [
    "class TreeNode():#二叉树节点\n",
    "    def __init__(self,val,lchild=None,rchild=None):\n",
    "        self.label = ()\n",
    "        self.val = val\t\t\n",
    "        self.lchild = lchild\t\t\n",
    "        self.rchild = rchild\t\t\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34d620a6",
   "metadata": {},
   "source": [
    "## 3. 构造决策树，进行训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "79903ba3",
   "metadata": {},
   "outputs": [],
   "source": [
    "from json.encoder import INFINITY\n",
    "\n",
    "\n",
    "def calc_gini(df):\n",
    "    \"\"\"\n",
    "    计算数据集的基尼指数\n",
    "    :param df: 数据集\n",
    "    :return: 基尼指数\n",
    "    \"\"\"\n",
    "    count = 0\n",
    "    for i in df['income']:\n",
    "        if i == 0:\n",
    "            count += 1\n",
    "    p = count / df.index.stop\n",
    "    return 1 - p ** 2 - (1-p) ** 2\n",
    "    \n",
    "    \n",
    "\n",
    "def split_dataset(df, index, value):\n",
    "    \"\"\"\n",
    "    按照给定的列划分数据集\n",
    "    :param df: 原始数据集\n",
    "    :param index: 指定特征的列索引\n",
    "    :param value: 指定特征的值\n",
    "    :return: 切分后的数据集\n",
    "    \"\"\"\n",
    "    groups = df.groupby(df.index)\n",
    "    return df.get_group(value)\n",
    "\n",
    "def get_complete_dataset(df, df2):\n",
    "    df1 = df.append(df2)\n",
    "    return df1.drop_duplicates(keep=False)\n",
    "    \n",
    "def get_feature_num(df, index):\n",
    "    return len(df[index].value_counts().index)\n",
    "\n",
    "def choose_best_feature_to_split(df):\n",
    "    \"\"\"\n",
    "    选择最好的特征进行分裂\n",
    "    :param df: 数据集\n",
    "    :return: best_value:(分裂特征的index, 特征的值), best_df:(分裂后的左右子树数据集), best_gini:(选择该属性分裂的最小基尼指数)\n",
    "    \"\"\"\n",
    "    best_gini = INFINITY\n",
    "    column_name = list(df)\n",
    "    res = 0\n",
    "    for i in range(df.shape[1]):\n",
    "        index = column_name[i]\n",
    "        for j in range(get_feature_num(df, index)):\n",
    "            df_after = split_dataset(df, index, j)\n",
    "            df_after_comp = get_complete_dataset(df, df_after)\n",
    "            res = df_after.shape[0] / df.shape[0] * calc_gini(df_after) + df_after_comp.shape[0] / df.shape[0] * calc_gini(df_after_comp)\n",
    "            if res < best_gini:\n",
    "                best_value, best_df_l, best_df_r, best_gini = (index, j), df_after, df_after_comp, res\n",
    "    return best_value, best_df_l, best_df_r, best_gini\n",
    "        \n",
    "def is_same_gini(df, columns):\n",
    "    \"\"\"\n",
    "    判断数据集以某特征分裂的基尼指数是否相同\n",
    "    :param columns: 数据集\n",
    "    :return: True or False\n",
    "    \"\"\"\n",
    "    list = set()\n",
    "    for i in range(len(columns)):\n",
    "        index = columns[i]\n",
    "        for j in range(get_feature_num(df, index)):\n",
    "            df_after = split_dataset(df, index, j)\n",
    "            df_after_comp = get_complete_dataset(df, df_after)\n",
    "            res = df_after.shape[0] / df.shape[0] * calc_gini(df_after) + df_after_comp.shape[0] / df.shape[0] * calc_gini(df_after_comp)\n",
    "            list.add(res)\n",
    "    if len(list) == 1:\n",
    "        return True\n",
    "    else:\n",
    "        return False\n",
    "\n",
    "def getMostCa(df):\n",
    "    \"\"\"\n",
    "    返回数据集中出现次数最多的类别\n",
    "    :param df: 数据集\n",
    "    :return: 类别\n",
    "    \"\"\"\n",
    "    \n",
    "    column_name = list(df)\n",
    "    ca = (column_name[0], 0)\n",
    "    for i in range(df.shape[1]):\n",
    "        for key, value in df[column_name[i]].value_counts().items():\n",
    "            if value > ca[1]:\n",
    "                ca = (column_name[i], key)\n",
    "    return ca\n",
    "\n",
    "def build_decision_tree(df, columns, flags):\n",
    "    \"\"\"\n",
    "    构建CART树 \n",
    "    :param df: 数据集\n",
    "    :param columns: 特征列表\n",
    "    :param flags: 区分特征是否被完全区分开,初始为全0, 若某个特征被区分开那么flags对应的下标为0\n",
    "    :return: CART树\n",
    "    \"\"\"\n",
    "    for i in range(len(flags)):\n",
    "        index = get_feature_num(df, i)\n",
    "        if index == 1:\n",
    "            flags[i] = 0\n",
    "        else:\n",
    "            flags[i] = 1\n",
    "    node = TreeNode(df, None, None)\n",
    "    for i in range (len(flags)):\n",
    "        if flags[i] == 0:\n",
    "            node.label = (columns[i], df[columns[i]][0])\n",
    "            return node\n",
    "    if len(columns) == 0 or is_same_gini(df, columns):\n",
    "        node.label = getMostCa(df)\n",
    "        return node\n",
    "    best_value, best_df_l, best_df_r, best_gini = choose_best_feature_to_split(df)\n",
    "\n",
    "    # 递归结束情况1: 若当前集合的所有样本标签相等,即样本已被分\"纯\",则可以返回该标签值作为一个叶子节点\n",
    "    # 递归结束情况2: 若当前训练集的所有特征都被使用完毕,当前无可用特征但样本仍未分\"纯\"，则返回样本最多的标签作为结果\n",
    "    \n",
    "    \n",
    "def save_decision_tree(cart):\n",
    "    \"\"\"\n",
    "    决策树的存储\n",
    "    :param cart: 训练好的决策树\n",
    "    :return: void\n",
    "    \"\"\"\n",
    "    np.save('cart.npy', cart)\n",
    "    \n",
    "    \n",
    "def load_decision_tree():\n",
    "    \"\"\"\n",
    "    决策树的加载\n",
    "    :return: 保存的决策树\n",
    "    \"\"\"    \n",
    "    \n",
    "    cart = np.load('cart.npy', allow_pickle=True)\n",
    "    return cart.item()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 471,
   "id": "c73fc3f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = df_train_set.copy() #防止预处理重新来"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 472,
   "id": "75c305eb",
   "metadata": {},
   "outputs": [],
   "source": [
    "columns = df_train.columns.to_list()\n",
    "flags = [0 for i in range(len(columns))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 474,
   "id": "9b562b12",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "source": [
    "df_train.head()\n",
    "print(flags)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "e05a0578",
   "metadata": {},
   "outputs": [],
   "source": [
    "cart = build_decision_tree(df_train, columns, flags)\n",
    "save_decision_tree(cart)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7b0db06",
   "metadata": {},
   "source": [
    "## 4. 评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "59a39e20",
   "metadata": {},
   "outputs": [],
   "source": [
    "def classify(cart, df_row, columns):\n",
    "    \"\"\"\n",
    "    用训练好的决策树进行分类\n",
    "    :param cart:决策树模型\n",
    "    :param df_row: 一条测试样本\n",
    "    :param columns: 特征列表\n",
    "    :return: 预测结果\n",
    "    \"\"\"\n",
    "    \n",
    "\n",
    "\n",
    "def predict(cart, df, columns):\n",
    "    \"\"\"\n",
    "    用训练好的决策树进行分类\n",
    "    :param cart:决策树模型\n",
    "    :param df: 所有测试集\n",
    "    :param columns: 特征列表\n",
    "    :return: 预测结果\n",
    "    \"\"\"\n",
    "    pred_list = []\n",
    "    for i in range(len(df)):\n",
    "        pred_label = classify(cart, df.iloc[i,:], columns)\n",
    "        if pred_label == -1:\n",
    "            pred_label = random.randint(0, 1) # 防止classify执行到返回-1,但一般不会执行到返回-1\n",
    "        pred_list.append(pred_label)\n",
    "    return pred_list\n",
    "\n",
    "def calc_acc(pred_list, test_list):\n",
    "    \"\"\"\n",
    "    返回预测准确率\n",
    "    :param pred_list: 预测列表\n",
    "    :param test_list: 测试列表\n",
    "    :return: 准确率\n",
    "    \"\"\"\n",
    "    pred = np.array(pred_list)\n",
    "    test = np.array(test_list)\n",
    "    acc = np.sum(pred_list == test_list) / len(test_list)\n",
    "    return acc"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4022a5b",
   "metadata": {},
   "source": [
    "## 5. Demo"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad375aa3",
   "metadata": {},
   "source": [
    "#### (1) 下面只是测试模型能不能跑通,实际操作时需要用测试集进行评估\n",
    "#### (2) 此外，测试集应该需要做和训练集一样的预处理操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "255d70ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "columns = df_train.columns.to_list()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "e7759198",
   "metadata": {},
   "outputs": [],
   "source": [
    "cart = load_decision_tree() # 加载模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "c5be5e1e",
   "metadata": {},
   "outputs": [],
   "source": [
    "test_list = df_train['income'].to_numpy()\n",
    "pred_list = predict(cart, df_train, columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "76f41d4c",
   "metadata": {},
   "outputs": [],
   "source": [
    "acc = calc_acc(pred_list, test_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "id": "dee49d56",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "acc"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7.11 ('py37')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.11"
  },
  "vscode": {
   "interpreter": {
    "hash": "a28b1903ec49562f8dd3cf1b4e26fcf8a5ab546347c0c1e3181ffb237d267ef3"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
